3 Geo sats with 0.2 deg longitude separation (~150km), various inclinations.

Notional RPO maneuvers. Consider first burn at ~100km away from target.
credit: Ian T Mitchell, Draper Laboratory Overview of Rendezvous and Capture Operations, sspd.gsfc.nasa.gov, 2010, without permission

Input Parameters
days = 2 # Days to run sim
hours = 12 # Hours to run sim
lon0 = -71 # RSGS Longitude start (Boston)
target_name = 'GOES 1 ' # Target name (San Francisco)
Load TLE file locally (normally done live via spacetrack.org)
with open('../tle/geo.tle', 'rb') as f:
tle_list = pickle.load(f)
Calculate TLE orbits for all tracked satellites.
epoch1 = datetime.utcnow()
epoch2 = epoch1 + timedelta(days,0,0,0,0,hours)
sat_list = [Satellite(epoch1, epoch2) for n in range(0, len(tle_list), 3)]
for n, sat in enumerate(tqdm(sat_list, desc='Loading Satellites')):
tle = tle_list[n*3:n*3+3]
sat.load_tle(tle)
if target_name in sat.name:
sat.type = 'target'
sat_target = sat
Loading Satellites: 100%|██████████| 1354/1354 [00:02<00:00, 577.23it/s]
Parse out only objects in region between Start Lon. and Target Longitude.
lon2 = sat_target.lon[0]
lon0 = lon0 - nmp.sign(lon0)*2
lon2 = lon2 - nmp.sign(lon2)*2
tmp_list = []
for n, sat in enumerate(sat_list):
lon1 = sat.lon[0]
if (lon1 >= lon0 and lon1 <= lon2 and lon2 > lon0) \
or (lon1 <= lon0 and lon1 >= lon2 and lon2 < lon0):
tmp_list.append(sat)
sat_list = tmp_list
Build RSGS Orbit
rsgs = RSGS(epoch1, epoch2)
rsgs.set_params(-110, lon2)
Calculate motion for all epochs
for n, sat in enumerate(tqdm(sat_list, desc='Computing Motion')):
sat.get_motion()
sat.get_range(rsgs)
Computing Motion: 100%|██████████| 187/187 [00:00<00:00, 218.66it/s]
Calculate frames for 3D animation
sat_list.append(rsgs)
frame_cnt = sat_list[0].sim_cnt
frame_list = [GraphFrame(sat_list) for n in range(frame_cnt)]
for n, frame in enumerate(tqdm(frame_list, desc='Building Frames')):
frame.load_data(n)
Building Frames: 100%|██████████| 2/2 [00:00<00:00, 471.93it/s]
Sidereal Time Equations
NIMA Technical Reqort TR8350.2, "Department of Defense World Geodetic System 1984, Its Definition and Relationships With Local Geodetic Systems", 2000
Print Results and Graph
grf = Graph(frame_list, lon0, lon2, epoch1)
ani = grf.run()
HTML(ani.to_html5_video())
Cortex: "A new framework to develop object-oriented and executable SysML models using the IPython Notebook"
An Object-oriented and Executable SysML Framework for Rapid Model Development
Santiago Balestrini-Robinson, Dane F. Freeman, Daniel C. Browne 2015
OpenMDAO: "An Open-source framework for efficient Multidisciplinary Design, Analysis, & Optimization"
J. S. Gray, J. T. Hwang, J. R. R. A. Martins, K. T. Moore, and B. A. Naylor, “OpenMDAO: An Open-Source Framework for Multidisciplinary Design, Analysis, and Optimization,” Structural and Multidisciplinary Optimization, 2019.